package com.liuyfly.leetcode.questions;

/**
 * @author liuyangfang at 2022-08-31 13:19
 */
public class Question0012 {
    /**
     * 罗马数字包含以下七种字符： I， V， X， L，C，D 和 M。
     *
     * <pre>
      字符          数值
      I             1
      V             5
      X             10
      L             50
      C             100
      D             500
      M             1000
     * </pre>
     *
     * 例如， 罗马数字 2 写做 II ，即为两个并列的 1。12 写做 XII ，即为 X + II 。 27 写做 XXVII, 即为 XX + V +
     * II 。 <br/>
     * 通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做 IIII，而是 IV。数字 1 在数字 5 的左边，所表示的数等于大数 5
     * 减小数 1 得到的数值 4 。同样地，数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况：
     * <ul>
     * <li>I 可以放在 V (5) 和 X (10)的左边，来表示 4 和 9。</li>
     * <li>X 可以放在 L (50) 和 C (100) 的左边，来表示 40 和 90。</li>
     * <li>C 可以放在 D (500) 和 M (1000) 的左边，来表示 400 和 900。</li>
     * </ul>
     * 给你一个整数，将其转为罗马数字。 <br/>
     * <br/>
     * 链接：https://leetcode.cn/problems/integer-to-roman
     */
    public static String intToRoman(int num) {
        StringBuilder builder = new StringBuilder();
        int k = num / 1000;
        if (k > 0) {
            for (int i = 0; i < k; i++) {
                builder.append("M");
            }
        }
        int remaining = num % 1000;
        int h = remaining / 100;
        if (h >= 9) {
            builder.append("CM");
            remaining = remaining % 900;
        } else if (h >= 5) {
            builder.append("D");
            for (int i = 0; i < h % 5; i++) {
                builder.append("C");
            }
            remaining = remaining % 100;
        } else if (h >= 4) {
            builder.append("CD");
            remaining = remaining % 400;
        } else {
            for (int i = 0; i < h; i++) {
                builder.append("C");
            }
            remaining = remaining % 100;
        }
        int t = remaining / 10;
        if (t >= 9) {
            builder.append("XC");
            remaining = remaining % 90;
        } else if (t >= 5) {
            builder.append("L");
            for (int i = 0; i < t % 5; i++) {
                builder.append("X");
            }
            remaining = remaining % 10;
        } else if (t >= 4) {
            builder.append("XL");
            remaining = remaining % 40;
        } else {
            for (int i = 0; i < t; i++) {
                builder.append("X");
            }
            remaining = remaining % 10;
        }
        if (remaining == 9) {
            builder.append("IX");
        } else if (remaining >= 5) {
            builder.append("V");
            for (int i = 0; i < remaining % 5; i++) {
                builder.append("I");
            }
        } else if (remaining == 4) {
            builder.append("IV");
        } else {
            for (int i = 0; i < remaining; i++) {
                builder.append("I");
            }
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        System.out.println(intToRoman(600));
    }
}
